package com.wjr.braveheart.eventbus;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.meta.SubscriberInfoIndex;

public class EventBusUtils {
    /**
     * Application类中调用方法：EventBusUtils.init(new MyEventBusIndex());
     * 编译成功，生成由eventBusIndex指定的索引类
     * 使用索引的Android应用程序速度更快，并且避免了由于反射导致的崩溃
     *
     * @param subscriberInfoIndex
     */
    public static void init(SubscriberInfoIndex subscriberInfoIndex) {
        EventBus.builder().addIndex(subscriberInfoIndex).installDefaultEventBus();
    }

    /**
     * 注册方法
     * 若注册的act没有@Subscribe注解，会抛异常
     */
    public static void register(Object subscriber) {
        if (!EventBus.getDefault().isRegistered(subscriber)) {
            try {
                EventBus.getDefault().register(subscriber);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 接触注册
     */
    public static void unregister(Object subscriber) {
        if (EventBus.getDefault().isRegistered(subscriber)) {
            try {
                EventBus.getDefault().unregister(subscriber);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 发送即时事件
     */
    public static void sendEvent(MessageEvent event) {
        EventBus.getDefault().post(event);
    }

    /**
     * 发送粘性事件
     */
    public static void sendEventSticky(MessageEvent event) {
        EventBus.getDefault().postSticky(event);
    }

    /**
     * 移除所以粘性事件
     */
    public static void removeAllStickyEvent() {
        EventBus.getDefault().removeAllStickyEvents();
    }

    /**
     * 移除一个粘性事件
     */
    public static boolean removeStickyEvent(MessageEvent event) {
        return EventBus.getDefault().removeStickyEvent(event);
    }

    /**
     * 移除一个指定类型的粘性事件
     */
    public static <T> T removeClassStickyEvent(Class<T> clazz) {
        return EventBus.getDefault().removeStickyEvent(clazz);
    }

    /**
     * 优先级高的订阅者可以终止事件往下传递
     */
    public static void cancelEventDelivery(MessageEvent event) {
        try {
            EventBus.getDefault().cancelEventDelivery(event);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 清空缓存
     */
    public static void clearCache() {
        EventBus.clearCaches();

    }
}
